﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Specialized;
using System.Collections.Generic;

namespace WebArchivosTelefonica.Jerarquias
{
	/// <summary>
	/// Control para administracion de la estructura de documentos de un proyecto
	/// </summary>
	public partial class ControlEditarEstructuraDocumentos : System.Web.UI.UserControl
	{
		/// <summary>
		/// Page load del documento
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void Page_Load(object sender, EventArgs e)
		{
			

			Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
			//AdministradorProyectos adminProyectos = new AdministradorProyectos(new FabricaLinqDataSource(), new EntidadLinqDataContext());
			//string nombreCarpetaBase = "CarpetaBase_" + Page.Request.Params.Get("idCliente") + "_" + Page.Request.Params.Get("idProyecto");

			//_gridViewCarpetasHijas.DataSource = admin.GetDataSourceReadOnlyCollectionCarpetasHijas(nombreCarpetaBase);
			//_gridViewCarpetasHijas.DataBind();

			
			//adminProyectos.Dispose();
			if (!Page.IsPostBack)
			{
                ControlEstadosDocumento1.Visible = false;
				HiddenFieldIdProyecto.Value = Page.Request.Params.Get("idProyecto");
				string nombreCarpetaBase = "CarpetaBase_" + Page.Request.Params.Get("idCliente") + "_" + HiddenFieldIdProyecto.Value;
				ViewState["nombreCarpetaBase"] = nombreCarpetaBase;
				//el nombre debe ser unico por lo que se busca el id del nombre que se esta buscando
				Guid idCarpetaBase = admin.GetIdCarpetaByName(nombreCarpetaBase);
				ViewState["idCarpetaBase"] = idCarpetaBase.ToString();
				_hiddenFieldIdCarpetaBase.Value = idCarpetaBase.ToString();

				_gridViewCarpetasHijas.DataBind();
               


				ActualizarVisualizacion();
			}

			

			admin.Dispose();
		}

		private void ActualizarVisualizacion()
		{
			//visualización de gridviews asociados a selección en gridview de carpeta principal
			bool selectedIndexInvalid = _gridViewCarpetasHijas.SelectedIndex == -1;
			//ver mensaje o gridview para Carpetas secundarias
			_labelSecundariasWarningSeleccionarCarpetaPrincipal.Visible = selectedIndexInvalid;
			_gridViewCarpetasNietas.Visible = !selectedIndexInvalid;

			//ver mensaje o gridview para Documentos asociados
			_labelDocumentosWarningSeleccionarCarpetaPrincipal.Visible = selectedIndexInvalid;
			_gridViewDocumentosPlantilla.Visible = !selectedIndexInvalid;

			//deshabilitar columna de agregar para gridview de tags si no esta seleccionado
			_gridViewTagsDocumentos.Columns[2].Visible = !selectedIndexInvalid;

			//ocultar agregar para carpetas secundarias
			_textBoxNuevaCarpetaNieta.Visible = !selectedIndexInvalid;
			_buttonAgregarCarpetaNieta.Visible = !selectedIndexInvalid;
		}


		/// <summary>
		/// Evento para agregar una nueva carpeta a la carpeta base
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _buttonAgregarCarpetaHija_Click(object sender, EventArgs e)
		{
			if (Page.IsValid)
			{
				Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
				string nombreCarpetaBase = (string)ViewState["nombreCarpetaBase"];
				Guid idCarpetaBase = admin.GetIdCarpetaByName(nombreCarpetaBase);

				admin.InsertarCarpetaNueva(idCarpetaBase, _textBoxNuevaCarpetaHija.Text);

				admin.Dispose();

				//actualización del gridview con nueva carpeta insertada
				_gridViewCarpetasHijas.DataBind();
				_gridViewCarpetasHijas.SelectedIndex = -1;
				_gridViewCarpetasNietas.DataBind();
				_gridViewDocumentosPlantilla.DataBind();

				ActualizarVisualizacion();

			}
		}
		/// <summary>
		/// Evento para agregar una nueva carpeta nieta
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _buttonAgregarCarpetaNieta_Click(object sender, EventArgs e)
		{
			if (Page.IsValid)
			{
				Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());

				Guid idCarpetaBase = new Guid(_gridViewCarpetasHijas.SelectedDataKey.Value.ToString());

				admin.InsertarCarpetaNueva(idCarpetaBase, _textBoxNuevaCarpetaNieta.Text);

				admin.Dispose();

				//actualización del gridview con nueva carpeta insertada
				_gridViewCarpetasNietas.DataBind();
			}
		}


		/// <summary>
		/// Evento de seleccion de filas
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _gridViewCarpetasHijas_SelectedIndexChanged(object sender, EventArgs e)
		{
			if (_gridViewCarpetasHijas.SelectedDataKey != null)
			{
				_hiddenFieldIdCarpetaHijaSeleccionada.Value = _gridViewCarpetasHijas.SelectedDataKey.Value.ToString();

				_gridViewCarpetasNietas.DataBind();
			}
			ActualizarVisualizacion();
		}
		/// <summary>
		/// Evento de seleccion de tag de documentos
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _gridViewTagsDocumentos_SelectedIndexChanged(object sender, EventArgs e)
		{
			//se hace bind al detailsview para que este sincronisado con el item seleccionado
			_detailsViewDocumentoTag.DataBind();
		}
		/// <summary>
		/// Evento de finalización de creacion de nuevo item en el detailsView de tags de documentos
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _detailsViewDocumentoTag_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
		{
			//se hace bind en el gridview de tags para actualizar el nuevo item
			_gridViewTagsDocumentos.DataBind();
		}

		/// <summary>
		/// Evento de finalización de actualizacion de nuevo item en el detailsView de tags de documentos
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _detailsViewDocumentoTag_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
		{
			//se hace bind en el gridview de tags para actualizar el gridview
			_gridViewTagsDocumentos.DataBind();

		}


		/// <summary>
		/// Evento de finalización de borrado de nuevo item en el detailsView de tags de documentos
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _detailsViewDocumentoTag_ItemDeleted(object sender, DetailsViewDeletedEventArgs e)
		{
			//se hace bind en el gridview de tags para actualizar el gridview
			_gridViewTagsDocumentos.DataBind();

		}
		/// <summary>
		/// Evento rowcommand para gridview de tags de documentos
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _gridViewTagsDocumentos_RowCommand(object sender, GridViewCommandEventArgs e)
		{
			//Se obtienen variables necesarias		
			Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());

			Guid idProyecto = new Guid(HiddenFieldIdProyecto.Value);

			//se valida el hiddenfield primero antes de asignar jerarquiacarpeta
			Guid idJerarquiaCarpeta = new Guid();
			if (!string.IsNullOrEmpty(_hiddenFieldIdCarpetaHijaSeleccionada.Value))
				idJerarquiaCarpeta = new Guid(_hiddenFieldIdCarpetaHijaSeleccionada.Value);
			int indiceTagSeleccionado = int.Parse(e.CommandArgument.ToString());
			int idDocumentoTag = int.Parse(_gridViewTagsDocumentos.DataKeys[indiceTagSeleccionado].Value.ToString());
			//se revisa el origen del comando 
			if (e.CommandName == "agregarTagEstructura")
			{



				//se crea el documento plantilla en la base de datos
				admin.UploadDocumento("", null, "Plantilla", idJerarquiaCarpeta, new FabricaObjetosLinqJerarquiaDocumentos(), idProyecto, idDocumentoTag);
				//se actualiza gridview de documentos plantilla para el proyecto
				_gridViewDocumentosPlantilla.DataBind();

				//se agrega el documento a todos los candidatos relacionados del proyecto

				//se traen primero todos los candidatos asociados al proyecto
				ListItemCollection sitios = admin.GetDataSourceSitios(idProyecto.ToString());

				//se recorre el listado creando el documento y creando la asociacion con el candidato
				foreach (ListItem sitio in sitios)
				{
					ListItemCollection candidatos = admin.GetDataSourceCandidatos(sitio.Value.ToString(), idProyecto.ToString());

					foreach (ListItem candidato in candidatos)
					{
						admin.UploadDocumento("", null, "", idJerarquiaCarpeta, new Guid(candidato.Value), idDocumentoTag, idProyecto);
					}
				}
			}
			admin.Dispose();
		}

		/// <summary>
		/// Evento rowcommand para gridview de tags de la plantilla
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _gridViewDocumentosPlantilla_RowCommand(object sender, GridViewCommandEventArgs e)
		{
			//se obtienen variables necesarias
			Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
			int indice = int.Parse(e.CommandArgument.ToString());
			Guid idProyecto = new Guid(HiddenFieldIdProyecto.Value);
			Guid idDocumento = new Guid(_gridViewDocumentosPlantilla.DataKeys[indice].Value.ToString());
			int idDocumentoTag = (int)_gridViewDocumentosPlantilla.DataKeys[indice].Values["IdDocumentoTag"];
			Guid idJerarquiaCarpeta = new Guid(_hiddenFieldIdCarpetaHijaSeleccionada.Value);


			//se revisa el origen del comando 
			if (e.CommandName == "borrarTagEstructura")
			{
				//se elimina el documento a todos los candidatos relacionados del proyecto

				//se traen primero todos los candidatos asociados al proyecto
				ListItemCollection sitios = admin.GetDataSourceSitios(idProyecto.ToString());

				//se borran todos los documentos incluyendo el de plantilla
			   admin.BorrarDocumentos(idProyecto, idJerarquiaCarpeta, idDocumentoTag);
			}

			//Si el evento es de cambio de relevante
			if (e.CommandName == "switchRelevanteTagEstructura")
			{
				//se cambia el documento de la plantilla
				admin.SwitchRelevancia(idProyecto, idJerarquiaCarpeta, idDocumentoTag);
				//se cambian todos los documentos relacionados
			}
            if (e.CommandName == "Select")
            {
                int seleccion = int.Parse(e.CommandArgument.ToString());
                string idDocumentoSeleccionado = _gridViewDocumentosPlantilla.DataKeys[seleccion].Value.ToString();

                ControlEstadosDocumento1.CambiarValoresControl(HiddenFieldIdProyecto.Value, idDocumentoSeleccionado);
                ControlEstadosDocumento1.Visible = true;
            }


			admin.Dispose();
			//se actualiza gridview de documentos plantilla para el proyecto
			_gridViewDocumentosPlantilla.DataBind();
		}

		/// <summary>
		/// Evento de validación de valor repetido al agregar una carpeta hija
		/// </summary>
		/// <param name="source"></param>
		/// <param name="args"></param>
		protected void CustomValidatorAgregarCarpetaHija_ServerValidate(object source, ServerValidateEventArgs args)
		{
			string nombreCarpetaNueva = args.Value;

			Guid idCarpetaBase = new Guid((string)ViewState["idCarpetaBase"]);

			Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());

			List<IEntidadLinqJerarquiaCarpeta> listaCarpetas = admin.GetDataSourceReadOnlyCollectionCarpetasHijas(idCarpetaBase).ToList();

			admin.Dispose();

			IEntidadLinqJerarquiaCarpeta carpeta = listaCarpetas.Find(x => x.Nombre == nombreCarpetaNueva);

			args.IsValid = carpeta == null;
		}


		/// <summary>
		/// Evento de validación de valor repetido para agregar una carpeta nieta
		/// </summary>
		/// <param name="source"></param>
		/// <param name="args"></param>
		protected void CustomValidatorAgregarCarpetaNieta_ServerValidate(object source, ServerValidateEventArgs args)
		{
			string nombreCarpetaNueva = args.Value;

			Guid idCarpetaBase = new Guid(_gridViewCarpetasHijas.SelectedDataKey.Value.ToString());

			Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());

			List<IEntidadLinqJerarquiaCarpeta> listaCarpetas = admin.GetDataSourceReadOnlyCollectionCarpetasHijas(idCarpetaBase).ToList();

			admin.Dispose();

			IEntidadLinqJerarquiaCarpeta carpeta = listaCarpetas.Find(x => x.Nombre == nombreCarpetaNueva);

			args.IsValid = carpeta == null;
		}

		/// <summary>
		/// Evento de validación de valor repetido para editar una carpeta hija
		/// </summary>
		/// <param name="source"></param>
		/// <param name="args"></param>
		protected void CustomValidatorEditarCarpetaHija_ServerValidate(object source, ServerValidateEventArgs args)
		{
			string nombreCarpetaNueva = args.Value;

			Guid idCarpetaBase = new Guid((string)ViewState["idCarpetaBase"]);

			Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());

			List<IEntidadLinqJerarquiaCarpeta> listaCarpetas = admin.GetDataSourceReadOnlyCollectionCarpetasHijas(idCarpetaBase).ToList();

			admin.Dispose();

			IEntidadLinqJerarquiaCarpeta carpeta = listaCarpetas.Find(x => x.Nombre == nombreCarpetaNueva);

			args.IsValid = carpeta == null;
		}

		/// <summary>
		/// Evento de actualización del gridview de carpetas hijas usado para evitar actualización si la pagina no es valida
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _gridViewCarpetasHijas_RowUpdating(object sender, GridViewUpdateEventArgs e)
		{
			e.Cancel = !Page.IsValid;
			
		}

		/// <summary>
		/// Evento de actualización del gridview de carpetas nietas usado para evitar actualización si la pagina no es valida
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void _gridViewCarpetasNietas_RowUpdating(object sender, GridViewUpdateEventArgs e)
		{
			e.Cancel = !Page.IsValid;
		}

	}
}